package com.itheima.controller;

import ch.qos.logback.core.util.StringUtil;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.dao.EmployeeDao;
import com.itheima.po.Employee;
import com.itheima.po.R;
import com.itheima.service.EmployeeService;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

//@estController=@Controller+@ResponseBody
@RestController
@RequestMapping("/employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;
    @RequestMapping("/login")
//    @RequestBody Employee收到前端传来的雇员的信息
    public R<Employee> login(@RequestBody Employee employee, HttpSession httpSession){
//        处理逻辑如下：
//        1、将页面提交的密码password进行md5加密处理
        if(null == employee || StringUtils.isBlank(employee.getUsername()) || StringUtils.isBlank(employee.getPassword())){
            R.error("用户名或密码不可为空");
        }
//        DigestUtils.md5DigestAsHex生成一个md5的加密
        String passwordMd5 = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
//        2、根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee employeeInDb = employeeService.getOne(lambdaQueryWrapper);
//        3、如果没有查询到则返回登录失败结果
        if(null == employeeInDb){
            R.error("用户不存在");
        }
//        4、密码比对，如果不一致则返回登录失败结果
        if(!passwordMd5.equals(employeeInDb.getPassword())){
            R.error("用户名或密码有误");
        }
//        5、查看员工状态，如果为已禁用状态，则返回员工已禁用结果
        if(employeeInDb.getStatus() == 0){
            R.error("用户已禁用，请联系管理员");
        }
//        6、登录成功，将员工id存入session并返回登录成功结果
        httpSession.setAttribute("employeeId",employeeInDb.getId());
        return R.success(employeeInDb);
    }
    @RequestMapping(value = "/logout",method = RequestMethod.POST)
    public R<String> logout(HttpSession httpSession){
//        清理session
        httpSession.removeAttribute("employeeId");
        return R.success("");
    }

//    Request URL:http://localhost:8080/employee
//    Requset Method :POST 新增员工
    @PostMapping("/save")
    public R<String> save(@RequestBody Employee employee,HttpSession httpSession){
//        1、补充缺少的字段 密码 初始密码123456 创建人 创建时间 更新人  更新时间
//        (状态数据库填充 ，当然也可以手动添加）
        System.out.println("employee save thread id" + Thread.currentThread().getId());
//        employee.setCreateTime(LocalDateTime.now());
//        employee.setUpdateTime(LocalDateTime.now());
//        employee.setCreateUser((Long) httpSession.getAttribute("employeeId"));
//        employee.setUpdateUser((Long)httpSession.getAttribute("employeeId"));
//        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
//        2、service调用save方法进行保存

        employeeService.save(employee);
        return R.success("添加成功");
    }
//    Request URL
//    Request Method:GET
    @GetMapping("/page")
    public R<Page> page(Integer page, Integer pageSize, String name){
        Page<Employee> pageResult = new Page<>(page, pageSize);
//        LambdaQueryWrapper使用lambds表达式的条件查询
//        lambdaQueryWrapper.like模糊查询
//        StringUtils.isNotBlank(name)判断是否不为空
//        Employee::getName 是一个方法引用，指向 Employee 类中的 getName 方法。这表示要在 Employee 实体的 name 属性上进行模糊查询。
        LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(StringUtils.isNotBlank(name),Employee::getName,name);
        employeeService.page(pageResult,lambdaQueryWrapper);
        return R.success(pageResult);
    }
//    修改状态
    @PostMapping()
    public R<String> update(@RequestBody Employee employee,HttpSession httpSession){
//        id status可以接到
//        更新 更新时间 更新人
//        employee.setUpdateTime(LocalDateTime.now());
//        employee.setUpdateUser((Long) httpSession.getAttribute("employeeId"));
//        service调用
        employeeService.updateById(employee);
        return R.success("修改成功");
    }
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id){
        return R.success(employeeService.getById(id));
    }


}
